Java "||"与"|" ,"&&"与"&"的区别

在看 Google 的一个 Sample 中,看到了这么的一段代码:

1
2
3
4
5
6
7
8
9
private void foo() {
...
boolen flagA = true;
boolen flagB = false;
if (flagA | flagB) {
// do something
}
...
}

这个项目中仅在一处或判断采用了 |,其他部分都使用||

两个运算值都是boolean类型,初步看来显然两者的结果、运行效果应该是相同的。我不太清楚这里是否是作者刻意为之,加之好奇还是进行了 Google。

结果还是很意思的,但其实也在预料之内:
||&&等逻辑运算,在运行时会发生Short-circuit evaluation。当||左值为true,或者&&左值为false时,便不会对右值进行运算。
|&等布尔运算则采用Eager evaluation。即一定会对右值进行运算。

那么如何在实际的开发中使用两者呢,引用 Stackoverflow回答 的举例:

1
2
3
4
5
Boolean b = true;
if(b || foo.timeConsumingCall())
{
//we entered without calling timeConsumingCall()
}
1
2
3
4
if(string != null && string.isEmpty())
{
//we check for string being null before calling isEmpty()
}

当然还有一个区别就是|&还可以位操作进行Bitmask